package com.yjhealth.libs.core.core.fragment;

import android.os.Bundle;
import android.support.annotation.Nullable;

public abstract class CoreLazyFragment extends CoreLifeFragment {
    private boolean isCreated = false;////界面是否加载完成
    private boolean isVisibleToUser = false;//是否可见,只有在viewpager中有值
    private boolean isVisibleToUserInCommint = false;//是否可见,只有在add,replace中有值
    private boolean lazyLoaded;//数据是否加载过了
    private boolean viewpagerLoad = false;//是否在viewpaper中

    /**
     * 需要懒加载使用，fragment显示时调用
     */
    protected void startHint() {
    }

    /**
     * 需要懒加载使用，fragment隐藏时调用
     */
    protected void endHint() {
    }

    /**
     * 没有必要时不要重写这个方法
     * view的初始化可以在onCreateView中执行
     * startHint调用问题，在viewpager和非viewpager模式下，startHint调用情况不同
     * @param savedInstanceState
     */
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        isCreated = true;

        if (!viewpagerLoad) {
            //使用add，replace等方法的情况下，需要主动调用下startHint
            startHint();
        } else if(isVisibleToUser) {
            //使用viewpagerd的情况下，第一个fragment需要主动调用下startHint
            // 因为setUserVisibleHint会比onActivityCreated优先调用，第一次进入时，调用setUserVisibleHint时isCreated=false，所以setUserVisibleHint中不会执行startHint
            startHint();
        }
    }

    /**
     * 只有在viewpager中才会调用，setUserVisibleHint会比onActivityCreated优先调用
     * @param isVisibleToUser
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        this.isVisibleToUser = isVisibleToUser;
        this.viewpagerLoad = true;
        if (!isCreated) {
            return;
        }

        if (isVisibleToUser) {
            startHint();
        } else {
            endHint();
        }
    }

    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        this.isVisibleToUserInCommint = !hidden;
        if (!isCreated) {
            return;
        }

        if (isVisibleToUserInCommint) {
            startHint();
        } else {
            endHint();
        }
    }

    public boolean isVisibleToUser() {
        return viewpagerLoad ? isVisibleToUser : isVisibleToUserInCommint;
    }

    public boolean isLazyLoaded() {
        return lazyLoaded;
    }

    public void setLazyLoaded(boolean lazyLoaded) {
        this.lazyLoaded = lazyLoaded;
    }
}
